package com.wk.arth.od;

import java.util.*;
/**查找单入口空闲区域
 题目描述
 给定一个 m x n 的矩阵，由若干字符 'X' 和
 'O'构成，'X'表示该处已被占据，'O'表示该处空闲，请找到最大的单入口空闲区域。
 解释：
 空闲区域是由连通的'O'组成的区域，位于边界的'O'可以构成入口，单入口空闲区域即有且
 只有一个位于边界的'O'作为入口的由连通的'O'组成的区域。
 如果两个元素在水平或垂直方向相邻，则称它们是“连通”的。 输入描述
 第一行输入为两个数字，第一个数字为行数 m，第二个数字列数 n，两个数字以空格分隔
 ，1 <= m, n <= 200，
 剩余各行为矩阵各行元素，元素为'X' 或 'O'，各元素间以空格分隔。 输出描述
 若有唯一符合要求的最大单入口空闲区域，输出三个数字，第一个数字为入口行坐标（范
 围为 0~行数-1），第二个数字为入口列坐标（范围为 0~列数- 1），第三个数字为区域大小，三个数字以空格分隔；
 若有多个符合要求的最大单入口空闲区域，输出一个数字，代表区域的大小；
 若没有，输出 NUL。
 * @author wukai
 * @date 2023/4/19 13:41
 */
public class Dan_ru_kou {
    public static int m;
    public static int n;
    public static String[][] strings;
    static HashSet<String> checked = new HashSet<>();
    static int[][] offset = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String[] mn = sc.nextLine().split(" ");
        m=Integer.parseInt(mn[0]);
        n=Integer.parseInt(mn[1]);
        strings=new String[m][n];
        for(int i=0;i<m;i++){
            strings[i] = sc.nextLine().split(" ");
        }
        System.out.println(getResult(strings,m,n));
    }

    private static String getResult(String[][] strings, int m, int n) {
        ArrayList<Integer[]> ans = new ArrayList<>();
        for (int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(strings[i][j].equals("O") && !checked.contains(i+"-"+j)){
                    ArrayList<Integer[]> enter = new ArrayList<>();
                    int count = dfs(i,j,0,enter);
                    if(enter.size() ==1){
                        Integer[] pos = enter.get(0);
                        Integer[] an = {pos[0],pos[1],count};
                        ans.add(an);
                    }
                }
            }
        }
        if(ans.size() == 0)
            return "NULL";
        ans.sort((a,b)->b[2]-a[2]);
        if(ans.size() == 1 || ans.get(0)[2]>ans.get(1)[2]){
            StringJoiner sj = new StringJoiner(" ");
            for (Integer ele : ans.get(0)) {
                sj.add(ele+"");
            }
            return sj.toString();
        }
        return ans.get(0)[2]+"";
    }

    private static int dfs(int i, int j, int count, ArrayList<Integer[]> enter) {
        String pos = i+"-"+j;
        if(i<0||i>=m||j<0||j>=n||"X".equals(strings[i][j]) || checked.contains(pos)){
            return count;
        }
        checked.add(pos);
        if(i == 0 || i==m-1||j==0||j==n-1)
            // 在边上的入口
            enter.add(new Integer[]{i,j});
        count++;
        for (int k=0;k<offset.length;k++){
            int offsetX = offset[k][0];
            int offsetY = offset[k][1];
            int newI = i+offsetX;
            int newJ = j+offsetY;
            count = dfs(newI,newJ,count,enter);
        }
        return count;
    }

}
